#include <iostream>
#include <winsock2.h>
#include <iphlpapi.h>
#include <icmpapi.h>
#include <time.h>
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")

void timeClient(const char* serverIp) {
    HANDLE hIcmp = IcmpCreateFile();
    if (hIcmp == INVALID_HANDLE_VALUE) {
        std::cout << "创建ICMP句柄失败" << std::endl;
        return;
    }

    DWORD serverAddr = inet_addr(serverIp);
    if (serverAddr == INADDR_NONE) {
        std::cout << "无效IP地址" << std::endl;
        return;
    }

    // 构建ICMP时间请求（类型13）
    char sendData[4] = {0}; // 时间戳字段（占位）
    char recvBuf[1024];
    DWORD timeout = 3000;

    // 发送时间请求
    DWORD bytes = IcmpSendEcho(hIcmp, serverAddr, sendData, 4,
        NULL, recvBuf, 1024, timeout);

    if (bytes > 0) {
        PICMP_ECHO_REPLY pEcho = (PICMP_ECHO_REPLY)recvBuf;
        if (pEcho->Type == 14) { // 时间应答（类型14）
            // 解析服务器返回的时间戳（秒数）
            DWORD serverTime = *(DWORD*)pEcho->Data;
            time_t t = serverTime;
            std::cout << "服务器时间: " << ctime(&t) << std::endl;
        } else {
            std::cout << "未收到时间应答" << std::endl;
        }
    } else {
        std::cout << "请求超时" << std::endl;
    }

    IcmpCloseHandle(hIcmp);
}

int main() {
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    timeClient("127.0.0.1"); // 连接本地时间服务器
    WSACleanup();
    return 0;
}